/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controladores;

import entities.EntradaSalidaArticulos;
import entities.VentasCabecera;
import entities.VentasDetalle;
import entities.VentasDetallePK;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceException;
import javax.persistence.Query;
import javax.transaction.HeuristicMixedException;
import javax.transaction.HeuristicRollbackException;
import javax.transaction.NotSupportedException;
import javax.transaction.RollbackException;
import javax.transaction.SystemException;
import javax.transaction.UserTransaction;

/**
 *
 * @author edgar
 */
@ManagedBean(name = "ventasController")
@SessionScoped
public class VentasController {

    @PersistenceContext(unitName = "sgal3PU")
    EntityManager em;
    private VentasCabecera ventasCabecera = new VentasCabecera();
    private DetalleVenta detalleVenta = new DetalleVenta();
    List<DetalleVenta> listaDetalle = new ArrayList();

    /**
     * @return the detalleVenta
     */
    public DetalleVenta getDetalleVenta() {
        return detalleVenta;
    }

    public void reset() {
        this.ventasCabecera = new VentasCabecera();
        this.detalleVenta = new DetalleVenta();
        this.listaDetalle.clear();
    }

    /**
     * @param detalleVenta the detalleVenta to set
     */
    public void setDetalleVenta(DetalleVenta detalleVenta) {
        this.detalleVenta = detalleVenta;
    }

    public void agregarDetalleVenta() {
        if (this.getListaDetalle().isEmpty()) {
            this.detalleVenta.setNroLinea(1);
        } else {
            this.detalleVenta.setNroLinea(this.getListaDetalle().size() + 1);
        }
        DetalleVenta dv = new DetalleVenta();
        dv.setNroLinea(this.getDetalleVenta().getNroLinea());
        dv.setArticulo(this.getDetalleVenta().getArticulo());
        dv.setCantidad(this.getDetalleVenta().getCantidad());
        dv.setPrecio(this.getDetalleVenta().getPrecio());
        this.getListaDetalle().add(dv);
        this.getDetalleVenta().setNroLinea(this.getDetalleVenta().getNroLinea() + 1);
    }

    public List<VentasDetalle> cargarDetalleVenta(VentasCabecera vc) {
        VentasDetalle vd = null;
        List<VentasDetalle> listaVD = new ArrayList();
        for (int i = 0; i < this.getListaDetalle().size(); i++) {
            VentasDetallePK vdpk = new VentasDetallePK();
            vdpk.setNroFactura(vc.getNroFactura());
            vdpk.setNroLinea(this.getListaDetalle().get(i).getNroLinea());
            vd = new VentasDetalle();
            vd.setVentasDetallePK(vdpk);
            vd.setVentasCabecera(vc);
            vd.setCodArticulo(this.getListaDetalle().get(i).getArticulo());
            vd.setCantidad(this.getListaDetalle().get(i).getCantidad());
            vd.setPrecio(this.getListaDetalle().get(i).getPrecio());
            listaVD.add(vd);
        }
        return listaVD;
    }

    public void guardarEntradaSalida(VentasDetalle ve) {
        EntradaSalidaArticulos esa = new EntradaSalidaArticulos();
        esa.setCantidad(ve.getCantidad());
        esa.setCodArticulo(ve.getCodArticulo());
        esa.setFecha(ve.getVentasCabecera().getFecha());
        esa.setNroDocumento(ve.getVentasCabecera().getNroFactura());
        esa.setObservaciones("Salida de artículos según Factura de venta Nro:" + ve.getVentasCabecera().getNroFactura());
        esa.setTipoMovimiento("S");
        em.persist(esa);
    }

    public void actualizarPagos() {
    }

    public Integer getTotalFactura(VentasCabecera vc) {
        Integer total = 0;
        for (int i = 0; i < vc.getVentasDetalleList().size(); i++) {
            List<VentasDetalle> ld = new ArrayList(vc.getVentasDetalleList());
            //     total=total+ ((ld.get(i).getCantidad()*ld.get(i).getPrecio());

        }

        return total;
    }

    public void generarCuotas(VentasCabecera vc) {
    }

    public String insertar() {
        UserTransaction t;
        try {
            t = (UserTransaction) new InitialContext().lookup("java:comp/UserTransaction");
            t.begin();
            em.persist(this.ventasCabecera);
            List<VentasDetalle> lista = this.cargarDetalleVenta(this.ventasCabecera);
            Integer montoFactura = 0;
            for (int i = 0; i < lista.size(); i++) {
                VentasDetalle vd = lista.get(i);
                em.persist(vd);
                if (this.ventasCabecera.getConfirmada()) {
                    this.guardarEntradaSalida(vd);
                }
                montoFactura = montoFactura + (vd.getPrecio() * vd.getCantidad().intValue());
            }
            if (this.ventasCabecera.getConfirmada()) {
                new CuotasACobrarController().insertar(ventasCabecera, montoFactura, em);
            }
            t.commit();
            this.reset();
        } catch (PersistenceException ex) {
            //t.rollback();
            ex.printStackTrace();
        } catch (NamingException ex) {
            Logger.getLogger(VentasController.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NotSupportedException ex) {
            Logger.getLogger(VentasController.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SystemException ex) {
            Logger.getLogger(VentasController.class.getName()).log(Level.SEVERE, null, ex);
        } catch (RollbackException ex) {
            Logger.getLogger(VentasController.class.getName()).log(Level.SEVERE, null, ex);
        } catch (HeuristicMixedException ex) {
            Logger.getLogger(VentasController.class.getName()).log(Level.SEVERE, null, ex);
        } catch (HeuristicRollbackException ex) {
            Logger.getLogger(VentasController.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SecurityException ex) {
            Logger.getLogger(VentasController.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalStateException ex) {
            Logger.getLogger(VentasController.class.getName()).log(Level.SEVERE, null, ex);
        }

        return "pages/pagos/pagos";
    }

    /**
     * @return the ventasCabecera
     */
    public VentasCabecera getVentasCabecera() {
        return ventasCabecera;
    }

    /**
     * @param ventasCabecera the ventasCabecera to set
     */
    public void setVentasCabecera(VentasCabecera ventasCabecera) {
        this.ventasCabecera = ventasCabecera;
    }

    /**
     * @return the listaDetalle
     */
    public List<DetalleVenta> getListaDetalle() {
        return listaDetalle;
    }

    /**
     * @param listaDetalle the listaDetalle to set
     */
    public void setListaDetalle(List<DetalleVenta> listaDetalle) {
        this.listaDetalle = listaDetalle;
    }
 

    
    /**
     * @return the listaFacturas
     */
    

    /**
     * @param listaFacturas the listaFacturas to set
     */
   
    
   
}
